-- 此lua脚本需判断库存是否充足、一人一单的问题
-- 判断抢够资格后直接向stream.orders队列中添加消息,内容包括voucherId,userId,orderId

-- 参数列表 需要传递优惠券id参数因为拼接key时要用到，userId是判断用户是否已经抢购过优惠券判断userId在不在set中
local voucherId = ARGV[1]
local userId = ARGV[2]
local orderId = ARGV[3]

-- key 在lua语言中字符串拼接用..语法
local stockKey = 'seckill:stock:' .. voucherId
local orderKey = 'seckill:order:' .. voucherId

-- 脚本业务
-- 1. 判断库存是否充足 不充足返回1
-- 因为redis操作的是string数据，所以无法和数值类型比较
if (tonumber(redis.call('get', stockKey)) <= 0) then
    return 1
end
-- 2.判断用户是否下过单 set数据类型 sismember orderKey userId 存在返回1否则0
if (redis.call('sismember',  orderKey,  userId) == 1) then
  --存在，重复下单
  return 2
end
-- 3. 如果该用户不存在订单，扣库存，并把userId追加到set集合中
-- 3.1 扣库存 incrby stockKey -1
redis.call('incrby',  stockKey,  -1)
-- 3.2 sadd orderKey userId
redis.call('sadd',  orderKey,  userId)

-- 4. 给消息队列发送消息,内容包括voucherId,userId,orderId
-- xadd stream.orders * 'voucherId' voucherId 'userId' userId 'id' orderId *代表唯一ID，由Redis自动生成
redis.call('xadd', 'stream.orders', '*',  'userId',  userId, 'voucherId',  voucherId,  'id',  orderId)
-- 一切正常返回0
return 0